textview: Send anchor with surrounding
authorMatthias Clasen <mclasen@redhat.com>
Thu, 4 Mar 2021 19:46:46 +0000 (14:46 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 4 Mar 2021 20:18:30 +0000 (15:18 -0500)
We have the api to do it now.

gtk/gtktextview.c

index bece4d58399702f8360f59aaa7238a9bb6077855..c3289a0ce816ffe880c4b9651735f74e19ea0e1e 100644 (file)
@@ -8259,19 +8259,54 @@ gtk_text_view_retrieve_surrounding_handler (GtkIMContext  *context,
 {
   GtkTextIter start;
   GtkTextIter end;
-  int pos;
+  GtkTextIter start1;
+  GtkTextIter end1;
+  int cursor_pos;
+  int anchor_pos;
   char *text;
+  char *pre;
+  char *sel;
+  char *post;
+  gboolean flip;
 
   gtk_text_buffer_get_iter_at_mark (text_view->priv->buffer, &start,
-                                   gtk_text_buffer_get_insert (text_view->priv->buffer));
-  end = start;
+                                    gtk_text_buffer_get_insert (text_view->priv->buffer));
+  gtk_text_buffer_get_iter_at_mark (text_view->priv->buffer, &end,
+                                    gtk_text_buffer_get_selection_bound (text_view->priv->buffer));
+
+  flip = gtk_text_iter_compare (&start, &end) < 0;
+
+  gtk_text_iter_order (&start, &end);
+
+  start1 = start;
+  end1 = end;
 
-  pos = gtk_text_iter_get_line_index (&start);
   gtk_text_iter_set_line_offset (&start, 0);
-  gtk_text_iter_forward_to_line_end (&end);
+  gtk_text_iter_forward_to_line_end (&end1);
+
+  pre = gtk_text_iter_get_slice (&start1, &start);
+  sel = gtk_text_iter_get_slice (&start, &end);
+  post = gtk_text_iter_get_slice (&end, &end1);
+
+  if (flip)
+    {
+      anchor_pos = strlen (pre);
+      cursor_pos = anchor_pos + strlen (sel);
+    }
+  else
+    {
+      cursor_pos = strlen (pre);
+      anchor_pos = cursor_pos + strlen (sel);
+    }
+
+  text = g_strconcat (pre, sel, post, NULL);
+
+  g_free (pre);
+  g_free (sel);
+  g_free (post);
+
+  gtk_im_context_set_surrounding_with_selection (context, text, -1, cursor_pos, anchor_pos);
 
-  text = gtk_text_iter_get_slice (&start, &end);
-  gtk_im_context_set_surrounding (context, text, -1, pos);
   g_free (text);
 
   return TRUE;